package com.itheima.stargraph.service;

import com.itheima.stargraph.pojo.ComfyuiModel;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * 工作流JSON渲染service层
 *
 * @Author mr.zhang
 * Date 2025/6/11 11:20
 */
@Component
public class FreeMarkerService {
    @Autowired
    private Configuration configuration;

    //模版对象
    private static final String MODEL_OBJECT = "workflow.ftl";


    /**
     * 基于工作流JSON模板渲染工作流JSON字符串
     */
    public String render(ComfyuiModel model){
        try {
            //1.获取模版对象
            Template template = configuration.getTemplate(MODEL_OBJECT);
            //2.准备数据
            Map<String,ComfyuiModel> map = new HashMap<>();//创建map集合,封装数据,键是config,值是model
            map.put("config",model);
            //3.创建输出流
            StringWriter out = new StringWriter();
            //4.执行渲染,将model数据按照template模版的形式渲染到out中
            template.process(map,out);
            //5.得到渲染结果
            //下面这行错误的原因是继承了tostring方法,但是没有重写,导致是对哈希码及类名进行操作的,而String与Date类型可以是因为重写了tostring方法
            // return out.toString().getBytes(StandardCharsets.UTF_8).toString(); 这种写法返回的是字节数组的内存地址,而不是真正返回的字符串
            return new String(out.toString().getBytes(StandardCharsets.UTF_8));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
        return null;
    }
}
